<?php
  // Interface spécifiant un service Ballon
  // Auteur : Sebastien Mosser
  
abstract class aFeature {

   protected $_acl ;
   
   // fonctions abstraites a définir : 

   // Renvoie l'entrée a afficher dans la ToC de l'utilisateur
   public abstract static function getToCEntry() ;

	// Renvoie le vrai nom de la fonctionnalité 
	public abstract static function getRealName() ;

	// Renvoie la sémantique (ie but) de la fonctionnalité
	public abstract static function getSemantic() ;

	// Demmare effectivement le service en interne: 
   // Remarque : PHP5 n'autorise pas les fonctions abstraites privées ... +o( 	
	protected abstract function run();  
  
  // Code commun a toutes les fonctionnalités
  
   // Verifie si la fonctionnalité est accessible a l'utilisateur	
   public final function isAvailable($userGroups) {
      return $this->_acl->isAvailable($userGroups);
   }
   
   // Lance la fonctionnalité avec les groupes de l'utilsateurs
	public final function start($userGroups) {
	   if ($this->_acl->isExposable($userGroups))
      	return $this->run();
	}   
  
  // Expose la fonctionnalité : (lancement puis affichage ) :
  public final static function expose($serviceName,$htmlMaker,$pageInfo) {
     try {
        $serviceClass = new ReflectionClass($serviceName);
        $feature = $serviceClass->newInstance();
        $page = $feature->start(Login::getGroups());
        $pageInfo["$@USERLOGIN@$"] = Login::getLoginName(). " ";
        $pageInfo["$@USERLOGIN@$"] .= Season::titleBar(Login::seasonChoosen());
        $text = $htmlMaker->makePage($page,$pageInfo);
        $log = new Log(Login::getLoginName(),$_SERVER['REQUEST_URI']);
        $log->create();
        header('Content-Type: text/html; charset=UTF-8');
        header('Pragma: no-cache');
        echo $text;
      }
      catch(Exception $exc) {
        header('Content-Type: text/html; charset=UTF-8');
      	ExceptionDisplayer::throw2Screen($exc);
      	$log = new Log(Login::getLoginName(),$_SERVER['REQUEST_URI']."/FAIL/");
        $log->create();
      	exit();
      }
   }
	
}

?>